<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 模板字符串
        // 植入变量,任意折行(原样输出)
        // var sNum = '13512345678';
        // var filename = 'index.txt';
        // if (sNum.startsWith('135')) { // 是否以'135'开头
        //     console.log('移动');
        // } else {
        //     console.log('联通');
        // }
        // if (filename.endsWith('.txt')) { // 是否以'.txt'结尾
        //     console.log('文本文件');
        // } else {
        //     console.log('图片文件');
        // }



        // 字符串的Unicode表示法
        // ES6 加强了对 Unicode 的支持，允许采用\uxxxx形式表示一个字符，其中xxxx表示字符的 Unicode 码点。
        // console.log('\u0061');
        // 但是，这种表示法只限于码点在\u0000~\uFFFF之间的字符。
        // 超出这个范围的字符，必须用两个双字节的形式表示
        // console.log('\uD842\uDFB7'); //𠮷
        // console.log('\u20BB7'); //7
        // 上面代码表示，如果直接在\u后面跟上超过0xFFFF的数值（比如\u20BB7），JavaScript 会理解成\u20BB+7。
        // 由于\u20BB是一个不可打印字符，所以只会显示一个空格，后面跟着一个7。

        // ES6 对这一点做出了改进，只要将码点放入大括号，就能正确解读该字符。
        // "\u{20BB7}"
        // // "𠮷"

        // "\u{41}\u{42}\u{43}"
        // // "ABC"

        // let hello = 123;
        // hell\ u {
        //     6 F
        // } // 123

        // '\u{1F680}' === '\uD83D\uDE80'
        // // true
        // 上面代码中，最后一个例子表明，大括号表示法与四字节的 UTF-16 编码是等价的。

        // 有了这种表示法之后，JavaScript 共有 6 种方法可以表示一个字符。

        // '\z' === 'z' // true
        // '\172' === 'z' // true
        // '\x7A' === 'z' // true
        // '\u007A' === 'z' // true
        // '\u{7A}' === 'z' // true




        // 实例方法：includes(),startsWith(),endsWith()
        // 传统上， JavaScript 只有indexOf方法， 可以用来确定一个字符串是否包含在另一个字符串中。 ES6 又提供了三种新方法。

        // includes()： 返回布尔值， 表示是否找到了参数字符串。
        // startsWith()： 返回布尔值， 表示参数字符串是否在原字符串的头部。
        // endsWith()： 返回布尔值， 表示参数字符串是否在原字符串的尾部。

        // let s = 'Hello world!';
        // s.startsWith('Hello') // true
        // s.endsWith('!') // true
        // s.includes('o') // true




        // 模板字符串
        // 传统的 JavaScript 语言， 输出模板通常是这样写的（ 下面使用了 jQuery 的方法）。

        // $('#result').append(
        //     'There are <b>' + basket.count + '</b> ' +
        //     'items in your basket, ' +
        //     '<em>' + basket.onSale +
        //     '</em> are on sale!'
        // );
        // 上面这种写法相当繁琐不方便， ES6 引入了模板字符串解决这个问题。

        // $('#result').append(`
        //   There are <b>${basket.count}</b> items
        //     in your basket, <em>${basket.onSale}</em>
        //   are on sale!
        // `);

        // 模板字符串（template string）是增强版的字符串，用反引号（`）标识。
        // 它可以当作普通字符串使用，也可以用来定义多行字符串，或者在字符串中嵌入变量。

        // 普通字符串
        // `In JavaScript '\n' is a line-feed.`

        // 多行字符串
        // `In JavaScript this is
        //  not legal.`

        //         console.log(`string text line 1
        // string text line 2`);

        // 字符串中嵌入变量
        // let name = "Bob",
        //     time = "today";
        // console.log(`Hello ${name}, how are you ${time}?`);

        // 上面代码中的模板字符串，都是用反引号表示。如果在模板字符串中需要使用反引号，则前面要用反斜杠转义
        // let greeting = `\`Yo\` World!`;

        // 如果使用模板字符串表示多行字符串， 所有的空格和缩进都会被保留在输出之中。

        //         $('#list').html(`
        // <ul>
        //   <li>first</li>
        //   <li>second</li>
        // </ul>
        // `.trim());
        // 上面代码中，所有模板字符串的空格和换行，都是被保留的，比如<ul>标签前面会有一个换行。
        // 如果你不想要这个换行，可以使用trim方法消除它。

        // 模板字符串中嵌入变量，需要将变量名写在${}之中。


        // 大括号内部可以放入任意的 JavaScript 表达式， 可以进行运算， 以及引用对象属性。

        // let x = 1;
        // let y = 2;

        // `${x} + ${y} = ${x + y}`
        // // "1 + 2 = 3"

        // `${x} + ${y * 2} = ${x + y * 2}`
        // // "1 + 4 = 5"

        // let obj = {
        //     x: 1,
        //     y: 2
        // };
        // `${obj.x + obj.y}` // "3"


        // 模板字符串之中还能调用函数。

        // function fn() {
        //     return "Hello World";
        // }

        // `foo ${fn()} bar` // foo Hello World bar

        // 如果大括号中的值不是字符串， 将按照一般的规则转为字符串。 
        // 比如， 大括号中是一个对象， 将默认调用对象的toString方法。
        // 如果模板字符串中的变量没有声明， 将报错。

        // 变量place没有声明
        // let msg = `Hello, ${place}`; // 报错


        // 由于模板字符串的大括号内部， 就是执行 JavaScript 代码， 因此如果大括号内部是一个字符串， 将会原样输出。

        // `Hello ${'World'}` // "Hello World"
        // 模板字符串甚至还能嵌套。

        //         const tmpl = addrs => `
        //   <table>
        //   ${addrs.map(addr => `
        //     <tr><td>${addr.first}</td></tr>
        //     <tr><td>${addr.last}</td></tr>
        //   `).join('')}
        //   </table>
        // `;
        // console.log(tmpl);



        // let func = (name) => `Hello ${name}!`;
        // console.log(func('Jack')); // "Hello Jack!"
        // 上面代码中， 模板字符串写成了一个函数的返回值。 
        // 执行这个函数， 就相当于执行这个模板字符串了。
    </script>
</body>

</html>